<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        // 创建一个Person类
        class Person{
            // 构造器方法 用于接收实例对象的属性
            constructor(name,age){
                // this 指向的是当前的 new 出来的实例对象
                this.name = name;
                this.age = age;
            }
            //一般方法 除了构造器方法外，其他方法都为一般方法
            // sayHi方法 放在类的原型对象上，供实例对象使用
            // 通过Person实例对象调用sayHi时，sayHi方法中的this指向的是Person实例对象
            sayHi(){
                console.log(`你好，我叫${this.name},我今年${this.age}岁`);
            }
        }
        // 创建一个Person的实例对象
        // const p1 = new Person("张三",18);
        // 创建另一个Person的实例对象
        // const p2 = new Person("李四",20);
        //constructor 去接收不同的参数，创建不同的实例对象
        // p1.sayHi();
        // p2.sayHi();

        //创建一个Student类，继承Person类
        class Student extends Person{
           constructor(name,age,score){
            // 调用父类的构造器方法 继承父类的实例属性和方法 
            // 当内部使用构造器方法时，必须调用super方法 并且调用super方法必须在this之前
            super(name,age);
            this.score = score;
           }
           sayHi(){
            // 调用父类的方法 方法在父类原型对象上
            super.sayHi();
           }
        }
        const stu = new Student("王五",22,99);
        console.log(stu);
        // 调用父类的方法 方法在父类原型对象上
        stu.sayHi();
        /*
            1.类中的构造器不是必须写的，需要对实例对象进行初始化操作，如添加特定的属性，才写构造器方法
            2.如果A类继承B类，A类中有构造器方法，则A类构造器方法中必须调用super方法，否则创建A类实例对象时会报错
            3. 类中定义的方法，都放在类的原型对象上，供实例对象使用
            4. 类创建的实例对象中，方法的this指向的是实例对象本身
        */
    </script>
</body>
</html>